import {
    getValue
} from '../util/ObjectUtil.js'
// nodeType == 1 的时候是标签节点
// nodeType == 2 的时候是属性节点
// nodeType == 3 的时候是文本节点

// 规范写法：to->2  for->4 

// 通过模板，找到那些节点用到这个模板
let template2Vnode = new Map();
// 通过节点, 找到这个节点下有那些模板
let vnode2Template = new Map();

export function renderMixin(Fvue) {
    Fvue.prototype._render = function () {
        renderNode(this, this._vnode);
    }
}
export function renderNode(vm, vnode) {
    if (vnode.nodeType === 3) { // 要渲染，首先要是文本节点
        let templates = vnode2Template.get(vnode);
        if (templates) {
            let result = vnode.text;
            for (let i = 0; i < templates.length; i++) {
                let templateValue = getTemplateValue([vm._data, vnode._env], templates[i])
                //当前节点的参数，可以来自于Due对象，也可以来自于父级节点(比如说for循环中的item，或者全局的变量)
                if (templateValue) {
                    result = result.replace('{{' + templates[i] + '}}', templateValue)
                }
            }
            vnode.elm.nodeValue = result;
        }
    } else {
        for (let i = 0; i < vnode.children.length; i++) {
            renderNode(vm, vnode.children[i]);
        }
    }
}

// 准备渲染
export function prepareRender(vm, vnode) {
    if (vnode == null) {
        return;
    }
    if (vnode.nodeType == 3) { // 是文本节点
        analysisTemplateString(vnode)
    }
    if (vnode.nodeType == 1) { // 标签节点
        for (let i = 0; i < vnode.children.length; i++) {
            prepareRender(vm, vnode.children[i])
        }
    }
}

function analysisTemplateString(vnode) {
    // 匹配模板字符串 
    let templateStrList = vnode.text.match(/{{[a-zA-Z0-9_.]+}}/g)
    for (let i = 0; templateStrList && i < templateStrList.length; i++) {
        setTemplate2Vnode(templateStrList[i], vnode)
        setVnode2Template(templateStrList[i], vnode)
    }
}

function setTemplate2Vnode(template, vnode) {
    let templateName = getTemplateName(template);
    let vnodeSet = template2Vnode.get(templateName);
    if (vnodeSet) {
        vnodeSet.push(vnode)
    } else {
        template2Vnode.set(templateName, [vnode])
    }
}

function setVnode2Template(template, vnode) {
    let templateSet = vnode2Template.get(vnode);
    if (templateSet) {
        templateSet.push(getTemplateName(template));
    } else {
        vnode2Template.set(vnode, [getTemplateName(template)])
    }
}

function getTemplateName(template) {
    // 判断有没有花括号，如果有，则解掉，如果没有则直接返回
    if (template.substring(0, 2) == "{{" && template.substring(template.length - 2, template.length) == "}}") {
        return template.substring(2, template.length - 2);
    } else {
        return template
    }
}

export function getTemplate2VnodeMap() {
    return template2Vnode;
}
export function getVnode2TemplateMap() {
    return vnode2Template;
}

// 以层级递进的方式获取值
function getTemplateValue(objs, templateName) {
    for (let i = 0; i < objs.length; i++) {
        let temp = getValue(objs[i], templateName);
        if (temp != null) {
            return temp;
        }
    }
    return null;
}